package ArrayList;

import org.junit.Test;

import java.util.Arrays;
import java.util.HashMap;

/**
 * @Classname JZ39数组中出现次数超过一半的数字
 * @Description TODO
 * @Date 2022/12/7 9:30
 * @Created by xjl
 */
public class JZ39数组中出现次数超过一半的数字 {

    /**
     * @description 利用Hashmap的方式的 时间O(n) 空间是O(n)
      * @param: nums
     * @date: 2022/12/7 9:30
     * @return: int
     * @author: xjl
    */
    public int majorityElement(int[] nums) {
        HashMap<Integer, Integer> map=new HashMap<>();
        for (int i:nums){
            if (!map.containsKey(i)){
                map.put(i,1);
            }else {
                map.put(i,map.get(i)+1);
            }
        }
        for (int i:map.keySet()){
            if (map.get(i)>nums.length/2){
                return i;
            }
        }
        return -1;
    }

    /**
     * @description 使用排序数组的特性  然后众数一定是在下标n/2的位置的数据
      * @param: nums
     * @date: 2022/12/7 9:56
     * @return: int
     * @author: xjl
    */
    public int majorityElement2(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }


    /**
     * @description 使用摩尔投票的方式来实现 当前为 vote=0 时候 就认为当前是众数 然后判断 后面是否是该数 如果是+1 如果不是-1 当等于0的时候更新的该数字 最后的就是众数就是该数了。
      * @param: nums
     * @date: 2022/12/7 10:06
     * @return: int
     * @author: xjl
    */
    public int majorityElement3(int[] nums) {
        int count=1;
        int result=nums[0];
        for ( int i=1;i< nums.length;i++){
            if (count==0){
               result=nums[i];
            }
            if (nums[i]==result){
                count++;
            }else {
                count--;
            }

        }
        return result;
    }


    @Test
    public void test(){
        int i = majorityElement3(new int[]{1, 2, 3, 2, 2, 2, 2, 3, 5, 4});
        System.out.println(i);
    }
}
